home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Ham Radio 2000 #2
/
Ham Radio 2000 - Volume 2.iso
/
HAMV2
/
TCP_IP
/
TNOS230S
/
ARP.H
< prev
next >
Wrap
C/C++ Source or Header
|
1997-07-30
|
5KB
|
142 lines
/* Mods by PA0GRI */
#ifndef _ARP_H
#define _ARP_H
#ifndef _GLOBAL_H
#include "global.h"
#endif
#ifndef _MBUF_H
#include "mbuf.h"
#endif
#ifndef _IFACE_H
#include "iface.h"
#endif
#ifndef _TIMER_H
#include "timer.h"
#endif
/* Lifetime of a valid ARP entry */
#define ARPLIFE 900 /* 15 minutes */
/* Lifetime of a pending ARP entry */
#define PENDTIME 15 /* 15 seconds */
/* Maximum number of datagrams in queue while pending an resolution */
#define ARP_QUEUE 5 /* 5 packets max on queue */
/* ARP definitions (see RFC 826) */
#define ARPLEN 16 /* Size of ARP hdr, minus hardware addresses */
/* Address size definitions */
#define IPALEN 4 /* Length in bytes of an IP address */
#define MAXHWALEN 16 /* Maximum length of a hardware address (was 255) */
/* ARP opcodes */
#define ARP_REQUEST 1
#define ARP_REPLY 2
#define REVARP_REQUEST 3
#define REVARP_REPLY 4
/* Hardware types */
#define ARP_NETROM 0 /* Fake for NET/ROM (never actually sent) */
#define ARP_ETHER 1 /* Assigned to 10 megabit Ethernet */
#define ARP_EETHER 2 /* Assigned to experimental Ethernet */
#define ARP_AX25 3 /* Assigned to AX.25 Level 2 */
#define ARP_PRONET 4 /* Assigned to PROnet token ring */
#define ARP_CHAOS 5 /* Assigned to Chaosnet */
#define ARP_IEEE802 6 /* Who uses this? */
#define ARP_ARCNET 7
#define ARP_APPLETALK 8
extern const char *Arptypes[]; /* Type fields in ASCII, defined in arpcmd */
#define NHWTYPES 9
/* Table of hardware types known to ARP */
struct arp_type {
int16 hwalen; /* Hardware length */
int16 iptype; /* Hardware type field for IP */
int16 arptype; /* Hardware type field for ARP */
int16 rarptype; /* Hardware type field for RARP */
int16 pendtime; /* # secs to wait pending response */
const char *bdcst; /* Hardware broadcast address */
char *(*format) (char *,char *);
/* Function that formats addresses */
int (*scan) (char *,const char *);
/* Reverse of format */
};
extern struct arp_type Arp_type[];
#define NULLATYPE (struct arp_type *)0
/* Format of an ARP request or reply packet. From p. 3 */
struct arp {
int16 hardware; /* Hardware type */
int16 protocol; /* Protocol type */
char hwalen; /* Hardware address length, bytes */
char pralen; /* Length of protocol address */
int16 opcode; /* ARP opcode (request/reply) */
char shwaddr[MAXHWALEN]; /* Sender hardware address field */
uint32 sprotaddr; /* Sender Protocol address field */
char thwaddr[MAXHWALEN]; /* Target hardware address field */
uint32 tprotaddr; /* Target protocol address field */
};
/* Format of ARP table */
struct arp_tab {
struct arp_tab *next; /* Doubly-linked list pointers */
struct arp_tab *prev;
struct timer timer; /* Time until aging this entry */
struct mbuf *pending; /* Queue of datagrams awaiting resolution */
uint32 ip_addr; /* IP Address, host order */
int16 hardware; /* Hardware type */
char state; /* (In)complete */
#define ARP_PENDING 0
#define ARP_VALID 1
char pub; /* Respond to requests for this entry? */
char *hw_addr; /* Hardware address */
struct iface *iface; /* Interface to use route on -- sm6rpz */
};
#define NULLARP (struct arp_tab *)0
extern struct arp_tab *Arp_tab[];
#ifdef UNIX
#ifndef recv
/* hack; we #define'd recv to j_recv to avoid stdc botch, so we need it here
else some things call this arp_stat.recv and others arp_stat.j_recv! */
#include "socket.h"
#endif
#endif
struct arp_stat {
unsigned recv; /* Total number of ARP packets received */
unsigned badtype; /* Incoming requests for unsupported hardware */
unsigned badlen; /* Incoming length field(s) didn't match types */
unsigned badaddr; /* Bogus incoming addresses */
unsigned inreq; /* Incoming requests for us */
unsigned replies; /* Replies sent */
unsigned outreq; /* Outoging requests sent */
};
extern struct arp_stat Arp_stat;
/* In arp.c: */
struct arp_tab *arp_add (uint32 ipaddr,int16 hardware,char *hw_addr,
int pub,struct iface *iface);
void arp_drop (void *p);
void arp_input (struct iface *iface,struct mbuf *bp);
struct arp_tab *arp_lookup (int16 hardware,uint32 ipaddr,struct iface *iface);
char *res_arp (struct iface *iface,int16 hardware,uint32 target,struct mbuf *bp);
/* In arphdr.c: */
struct mbuf *htonarp (struct arp *arp);
int ntoharp (struct arp *arp,struct mbuf **bpp);
/* In rarp.c: */
void rarp_input (struct iface *iface,struct mbuf *bp);
#ifndef REVARP_TYPE
/* should this be being used by non-ethernet-specific code? (arp.c) */
/* (ans: no. this could cause problems if rarp used on ax.25...) */
#define REVARP_TYPE 0x8035
#endif
#endif /* _ARP_H */